package com.zmh.service.httpclient;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mysql.cj.xdevapi.JsonString;
import com.zmh.common.DateUtil;
import com.zmh.model.iamtopnotes.NotesList;
import com.zmh.model.iamtopnotes.Page;
import com.zmh.model.iamtopnotes.Root;
import com.zmh.model.iamtopnotes.User;

/**
 * 公司工作日志系统对接
 * @author zhoumh
 * @version 创建时间：2017年10月18日 下午2:38:10 
 * @Description
 */
@Service
public class IamtopNotes {
	private static Logger logger = LoggerFactory.getLogger(IamtopNotes.class);
	@Autowired
	private HttpConnectionManager httpConnectionManager;
	private static CloseableHttpClient httpClient = null;
	private static CloseableHttpResponse response = null; 
	private static HttpClientContext httpContext = HttpClientContext.create();
	@PostConstruct
	public void init(){
		getHttpClient();
	}
	@PreDestroy  
    public void  dostory(){  
		closeHttpClient();
	}
	
	
	
	/**
	 * 获取未提交当日工作日志的人员列表
	 * @return: String 未填写工作日志的人员列表
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月18日 下午2:43:05 
	 * @Description:
	 */
	public String noSubmitNotes() {
		String curDay = DateUtil.getDate();
		String sendMessage = DateUtil.getDateTime()+" 还有如下同事未提交今天的工作日志，请注意填报: ";
		//登陆
		if (!login()) {
			//如果登陆失败终止后续程序执行
			logger.error("登陆notes失败，本次运行终止。");
			return "";
		}
		// 获取部门人员列表
		List<User> users = getDepartUserList();
		for (User user : users) {
			//获取人员ID
			int id = user.getRId();
			//如果是验证zhoumh本人工作日志上报，就跳过
			if(id == 58 && checkZhoumh(curDay)){
				continue;
			}
			String allWorkUrl = "http://notes.iamtop.com:64023/work/a/bus/workReview/findReviews?pageNo=1&type=allReviewed&busUser.id="+id+"&_="+System.currentTimeMillis();
			Root allWorkRoot = getWorkList(allWorkUrl);
			//获取全部工作列表中的第一条工作的时间
			String allInDate = allWorkRoot.getNotesList().get(0).getInDate();
			//如果全部工作列表中的第一条工作时间不等于今天
			if (!curDay.equals(allInDate)) {
				//查询未审阅工作列表第一条
				String weiyueUrl = "http://notes.iamtop.com:64023/work/a/bus/workReview/findReviews?pageNo=1&type=weiyue&busUser.id="+id+"&_="+System.currentTimeMillis();
				Root weiyueRoot = getWorkList(weiyueUrl);
				//如果该用户的未审阅工作为空
				if (weiyueRoot.getNotesList().size()==0) {
					sendMessage=sendMessage+user.getName()+" , ";
					continue;
				}
				//获取未阅工作列表中的第一条工作的时间
				String wyInDate = weiyueRoot.getNotesList().get(0).getInDate();
				//如果未审核工作列表中的第一条工作时间也不等于今天
				if (!curDay.equals(wyInDate)) {
					sendMessage=sendMessage+user.getName()+" , ";
				}
			}
		}
		return sendMessage.substring(0, sendMessage.length()-2)+"。";
	}
	/**
	 * 查询指定日期的工作日志填报情况
	 * @param date 指定的日期 2017-11-15
	 * @return: boolean true 已提报  false  未提报
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月16日 上午11:22:04 
	 * @Description:
	 */
	public boolean checkZhoumh(String date) {
		boolean result = false;
		String url = "http://notes.iamtop.com:64023/work/a/bus/workLog/findStatus?startDate="+date+"&_="+System.currentTimeMillis();
		// 预期返回值：{"code":true,"data":{"logStatus":"已上报","canLog":true}}
		String html = getHTML(url);
		JSONObject js = JSON.parseObject(html);
		String state = js.getJSONObject("data").getString("logStatus");
		// 如果这一天的日志状态是已上报就返回true
		if ("已上报".equals(state)) {
			result = true;
		}
		return result;
	}
	/**
	 * 获取未阅工作并设置为已阅
	 * @return: void
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月18日 下午2:43:05 
	 * @Description:
	 */
	public void getWeiYueNotes() {
		//登陆
		if (!login()) {
			//如果登陆失败终止后续程序执行
			logger.error("登陆notes失败，本次运行终止。");
			return;
		}
		String url = "http://notes.iamtop.com:64023/work/a/bus/workReview/findReviews?pageNo=1&type=weiyue&_="+System.currentTimeMillis();
		// 未批阅信息列表
		Root root = getWorkList(url);
		Page page = root.getPage();
		//如果还有未处理的待审批工作事项
		while (page.getPageCount()>1) {
			root = getWorkList(url);
			List<NotesList> notesLists = root.getNotesList();
			//循环处理第一页待审批工作事项
			for (int i = 0; i < notesLists.size(); i++) {
				NotesList notes = notesLists.get(i);
				String workLogId = new Integer(notes.getId()).toString();
				// 将工作处理为已阅
				saveReview(workLogId);
				System.out.println(notes.getBusUser().getName()+": "+notes.getId());
			}
		}
//		System.out.println(JSON.toJSON(root));
		closeHttpClient();
	}
	/**
	 * 根据URL发起请求并返回请求结果
	 * @param url 请求链接
	 * @author zhoumh
	 * @version 创建时间：2017年10月13日 上午10:30:47
	 */
	private String getHTML(String url) {
		String html = "";
		try {
			response = doGet(url);
			HttpEntity entity = response.getEntity();
			// 判断返回实体是否为空
			if (entity != null) {
				// 获取返回的内容
				html = EntityUtils.toString(entity, "UTF-8");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return html;
	}
	/**
	 * 登陆IamtopNotes
	 * @author zhoumh
	 * @version 创建时间：2017年10月12日 下午5:32:23
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	private boolean login(){
		boolean result = false;
		CloseableHttpResponse response = null;
		// 设置POST参数
		List<NameValuePair> formparams = new ArrayList<NameValuePair>();
		formparams.add(new BasicNameValuePair("username", "zhouminghao"));
		formparams.add(new BasicNameValuePair("password", "123456"));
		formparams.add(new BasicNameValuePair("rememberMe", "on"));
		UrlEncodedFormEntity uefEntity;
		try {
			uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
			// 发起登陆请求
			response = doPost("http://notes.iamtop.com:64023/work/a/login", uefEntity);
			if (response.getStatusLine().getStatusCode()==302) {
				result = true;
			}
		} catch (Exception e) {
			result = false;
			e.printStackTrace();
		} finally {
			// 关闭或释放资源
			try {
				response.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		logger.info("登陆请求结果: "+result);
//		System.out.println("登陆请求结果: "+result);
		return result;
	}
	/**
	 * 根据工作ID进行通过审核操作
	 * @param workLogId 待审核工作ID
	 * @return: boolean 操作是否成功
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月19日 下午3:18:32 
	 * @Description:
	 */
	private boolean saveReview(String workLogId){
		boolean result = true ;
		String url = "http://notes.iamtop.com:64023/work/a/bus/workReview/saveReview";
		// 设置POST参数 score=0&comment=&workLogId=11795&remarks=1
		List<NameValuePair> formparams = new ArrayList<NameValuePair>();
		formparams.add(new BasicNameValuePair("score", "0"));
		formparams.add(new BasicNameValuePair("comment", ""));
		formparams.add(new BasicNameValuePair("workLogId", workLogId));
		formparams.add(new BasicNameValuePair("remarks", "1"));
		try {
			UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
			doPost(url, uefEntity);
		} catch (Exception e) {
			result = false;
			e.printStackTrace();
		}
		return result;
		
	}
	/**
	 * 获取未审批工作列表
	 * @return: Root 返回的未审批工作第一页
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月19日 下午4:05:17 
	 * @Description:
	 */
	private Root getWorkList(String url){
		String html = getHTML(url);
		html = html.replace("list", "notesList");
		Root root = JSONArray.parseObject(html, Root.class);
		return root;
	}
	/**
	 * 获取部门工作人员列表
	 * @return: Root 返回的未审批工作第一页
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月19日 下午4:05:17 
	 * @Description:
	 */
	private List<User> getDepartUserList(){
		String url = "http://notes.iamtop.com:64023/work/a/bus/workReview/menu/treeData";
		String html = getHTML(url);
		List<User> allUsers = JSONArray.parseArray(html, User.class);
		List<User> derpatUsers = new ArrayList<User>();
		for (User user : allUsers) {
			//只选择产品研发部的人员
			if (user.getPId()==13) {
				derpatUsers.add(user);
			}
		}
		return derpatUsers;
	}
	/**
	 * 根据传入的URL和httpclient发起get请求并返回结果
	 * @param url 请求的地址
	 * @throws ClientProtocolException
	 * @throws IOException 
	 * @return: CloseableHttpResponse
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月17日 上午11:04:45 
	 * @Description:
	 */
	private CloseableHttpResponse doGet(String url)
			throws ClientProtocolException, IOException {
		HttpGet httpGet = new HttpGet(url);
		// 配置请求的HEADER部分
		httpGet.addHeader(HttpHeaders.ACCEPT, "application/xml");
		// 接收返回信息
		response = httpClient.execute(httpGet, httpContext);
		return response;
	}
	/**
	 * 根据传入的URL和httpclient发起POST请求并返回结果
	 * @param url 请求的地址
	 * @param uefEntity 请求的表单
	 * @throws ClientProtocolException
	 * @throws IOException 
	 * @return: CloseableHttpResponse
	 * @author: zhoumh
	 * @version: 创建时间：2017年7月26日 下午5:19:23
	 * @Description:
	 */
	private CloseableHttpResponse doPost(String url, UrlEncodedFormEntity uefEntity)
			throws ClientProtocolException, IOException {
		// Post请求
		HttpPost httppost = new HttpPost(url);
		httppost.setEntity(uefEntity);
		// 发送请求并接收返回信息
		response = httpClient.execute(httppost,httpContext);
		return response;
	}
	/**
	 * 从连接池获取httpclient
	 * @return: CloseableHttpClient
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月17日 上午9:45:28 
	 * @Description:
	 */
	private CloseableHttpClient getHttpClient(){
		if (httpClient==null) {
			httpClient = httpConnectionManager.getHttpsClient();
			// 设置cookie
//			RequestConfig requestConfig = RequestConfig.custom()
//					.setConnectionRequestTimeout(10000)
//					.setConnectTimeout(10000)
//					.setCookieSpec(CookieSpecs.STANDARD_STRICT)
//					.build();
//			httpClient = HttpClients.custom()
//					.setDefaultRequestConfig(requestConfig)
//					.build();
		}
		return httpClient;
	}
	/**
	 * 关闭httpclient
	 * @return: void
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月17日 上午9:45:50 
	 * @Description:
	 */
	private void closeHttpClient(){
		try {
//			response.close();
			httpClient.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
